import java.util.Stack;

//什么是栈？
//栈其实就是一种数据结构 特点：先进后出
//什么是java虚拟机栈？
//JVM内存分为五部分 ：
//      1.Java虚拟机栈
//Java虚拟机栈(JVM stack) 只是JVM当中一块内存 该内存一般用来存放
//例如 局部变量...   调用函数的时候 我们会为这个函数开辟一块内存 叫做栈帧 在哪里开辟？JVM stack
//      2.本地方法栈
//      3.堆
//      4.方法区
//      5.程序计数器
//
//那么这个栈到底这么用？用到哪里？
//1.入栈和出栈顺序 例如入栈顺序是abcde 出栈可能是什么？
//2.中缀表达式转后缀表达式（后缀表达式也称逆波兰表达式）
// 中缀表达式：（5+4）*3-2         （可以理解成我们普通的算术表达式）
// 后缀表达式： （加括号方式）  （（（5+4）*3）-2）
//           然后将当前括号内运算符挪到当前括号外面  然后去括号
//           （（（54）+3）*2）-   最后为后缀表达式：54+3*2-
//   中缀表达式转后缀表达式java代码思路（了解）：1.定义很多的常量 来表识每个运算符的优先级 2.借助栈
//3.    54-3*2-    如何通过这个后缀表达式计算一个值呢？
//通过栈 数字往栈里扔 遇到运算符 再从栈里取两个元素（先取的放在运算符右边）
public class TestDemo {
    public static void main1(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.pop());//4     弹出栈顶元素并且删除
        System.out.println(stack.peek());//3    弹出栈顶元素但不删除
        System.out.println(stack.peek());//3
        System.out.println(stack.empty());//false   是否为空
        System.out.println(stack.isEmpty());//false  Stack类没有isEmpty()但是它的父类有
    }


    public static void main2(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.peek();//报错 因为stack里面为空
    }

    public static void main3(String[] args) {
        MyStack stack = new MyStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
        System.out.println(stack.pop());//6     弹出栈顶元素并且删除
        System.out.println(stack.peek());//5    弹出栈顶元素但不删除
        System.out.println(stack.peek());//5
        System.out.println(stack.isEmpty());//false   是否为空
        System.out.println(stack.pop());//5
        System.out.println(stack.pop());//4
        System.out.println(stack.pop());//3
        System.out.println(stack.pop());//2
        System.out.println(stack.pop());//1
        System.out.println(stack.isEmpty());//true
        System.out.println(stack.pop());//抛异常  RuntimeException: 栈为空   之后下面就不会运行了
//        System.out.println(stack.peek());//抛异常  RuntimeException: 栈为空
//        System.out.println(stack.isEmpty());
    }


}
